有三個數字 a, b, c,今天可以修改 a 和 b,回傳至少要修改幾個 bit,才能使 a or b == c。
例如 a = 2 (0010), b = 6 (0110), c = 5 (0101) 時,需要將 2 和 6 的右邊數來第二個 bit 改為 0,再把 a 或 b 任意一個數字的右邊數來第一個 bit 改為 1,總共修改 3 個。
若 c 的第 k 個 bit 為 0,則 a 和 b 個第 k 個 bit 都要為 1;否則 a 和 b 最多只需要改 1 個即可。
把三個數字分別轉 2 進位太麻煩,直接從 0 開始 31 個 bit 一個個看就好,不用 32 個是因為題目保證是正數,int 的第一個 bit 是用來表示 sign (正負號) 的,所以那個 bit 不會需要修改。
int minFlips(int a, int b, int c) {
int ans = 0;
for(int i=0; i<31; i++) {
bool ba = a & (1 << i), bb = b & (1 << i), bc = c & (1 << i);
if ((ba | bb) == bc) continue;
if (!bc) ans += ba + bb;
else ans++;
}
return ans;
}
這題應該要去 easy 的,印象中寫過不少 medium 的題目都有用到看 bit 的技巧,而且這題我的 code 時間 100%,應該這是最佳寫法了,而這個寫法在很多題目都只是隨手寫出來的東西,所以我覺得他該去 easy 而不是 medium。